package main

import "fmt"

/*
栈的压入、弹出序列
输入两个整数序列，第一个序列表示栈的压入顺序，请判断第二个序列是否为该栈的弹出顺序。
假设压入栈的所有数字均不相等。例如，序列 {1,2,3,4,5} 是某栈的压栈序列，序列 {4,5,3,2,1}
是该压栈序列对应的一个弹出序列，但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。

示例 1：
输入：pushed = [1,2,3,4,5], popped = [4,5,3,2,1]
输出：true
解释：我们可以按以下顺序执行：
push(1), push(2), push(3), push(4), pop() -> 4,
push(5), pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1

示例 2：
输入：pushed = [1,2,3,4,5], popped = [4,3,5,1,2]
输出：false
解释：1 不能在 2 之前弹出。
*/

func validateStackSequences(pushed []int, popped []int) bool {
	var stack []int //创建辅助栈
	i := 0
	for _, v := range pushed {
		stack = append(stack, v)                                 //每插入一个元素到辅助栈中，判断是否可进行弹出操作
		for len(stack) > 0 && stack[len(stack)-1] == popped[i] { //模拟出栈 判断辅助栈弹出的元素会不会是popped里的元素0
			stack = stack[:len(stack)-1] //
			i++
		}
	}
	return !(len(stack) > 0) //len(stack)不大于0（等于0 即辅助栈里的元素全部顺利弹出）--->可以正常弹出
}

func main() {
	push := []int{1, 2, 3, 4, 5}
	pop := []int{4, 3, 5, 1, 2}
	fmt.Println(validateStackSequences(push, pop))
}
